package com.openlogic.common.plugins.db.api.datasource;

import java.io.IOException;
import java.sql.Connection;
import java.sql.SQLException;

import com.openlogic.common.plugins.db.api.dto.BaseDataSourceParamDto;
import com.openlogic.common.plugins.spi.enums.DbType;
import com.openlogic.datasource.api.param.ConnectionParam;

import jodd.db.connection.ConnectionProvider;

/**
* @ClassName: DataSourceProcessor
* @Description: 数据源处理器API
* @author weiyongpeng
* @date 2024年11月24日 下午5:14:07
 */
public interface DataSourceProcessor {

	/**
	* 描述：校验连接参数
	* @Title: checkDatsourceParam
	* @param dataSourceParam
	* @return
	* @author weiyongpeng
	* @date  2024年11月15日 下午4:19:35
	 */
	void checkDatasourceParam(BaseDataSourceParamDto dataSourceParam);
	
	/**
	* 描述：创建数据库连接参数实体
	* @Title: createConnectionParams
	* @param datasourceParam
	* @return
	* @author weiyongpeng
	* @date  2024年11月24日 下午5:14:03
	 */
	ConnectionParam createConnectionParams(BaseDataSourceParamDto datasourceParam);
	
	BaseDataSourceParamDto castDatasourceParamDTO(String paramJson);
	
	/**
	* 描述：获取数据源驱动
	* @Title: getDatasourceDriver
	* @return
	* @author weiyongpeng
	* @date  2024年11月24日 下午5:13:39
	 */
    String getDatasourceDriver();

    /**
    * 描述：获取validate的语句
    * @Title: getValidationQuery
    * @return
    * @author weiyongpeng
    * @date  2024年11月24日 下午5:13:16
     */
    String getValidationQuery();
	
	/**
	* 描述：获取连接JDBC的URL
	* @Title: getJdbcUrl
	* @param connectionParam
	* @return
	* @author weiyongpeng
	* @date  2024年11月15日 下午4:29:42
	 */
	String getJdbcUrl(ConnectionParam connectionParam);
	
	/**
	* 描述：获取连接
	* @Title: getConnection
	* @return
	* @throws ClassNotFoundException
	* @throws SQLException
	* @throws IOException
	* @author weiyongpeng
	* @date  2024年11月16日 上午8:00:05
	 */
    Connection getConnection(ConnectionParam connectionParam) throws ClassNotFoundException, SQLException, IOException;
	
    /**
    * 描述：获取数据库类型
    * @Title: getDbType
    * @return
    * @author weiyongpeng
    * @date  2024年11月16日 上午7:59:41
     */
    DbType getDbType();

    /**
    * 描述：创建dataSourceprocessor
    * @Title: create
    * @return
    * @author weiyongpeng
    * @date  2024年11月16日 上午7:59:24
     */
    DataSourceProcessor create();

    /**
    * 描述：获取指定表的所有列
    * @Title: columns
    * @param dbName
    * @param tableName
    * @return
    * @author weiyongpeng
    * @date  2024年11月8日 下午5:00:32
     */
    String columns(String dbName, String tableName);

    /**
    * 描述：获取数据库下的 所有表
    * @Title: tables
    * @param dbName
    * @return
    * @author weiyongpeng
    * @date  2024年11月8日 下午5:00:42
     */
    String tables(String dbName);

    /**
    * 描述：获取缓存数据源唯一ID
    * @Title: getDatasourceUniqueId
    * @param connectionParam
    * @param dbType
    * @return
    * @author weiyongpeng
    * @date  2024年11月24日 下午5:12:41
     */
	String getDatasourceUniqueId(ConnectionParam connectionParam, DbType dbType);
	
	/**
	* 描述：创建数据源DataSource
	* @Title: createDataSource
	* @param connectionParam
	* @return
	* @author weiyongpeng
	* @date  2024年11月24日 下午5:12:25
	 */
	ConnectionProvider createDataSource(ConnectionParam connectionParam);

	/**
	* 描述：解析生成分页SQL
	* @Title: parsePageSql
	* @param orignSql
	* @param pageSize 
	* @param page 
	* @return
	* @author weiyongpeng
	* @date  2024年11月24日 下午5:12:08
	 */
	String parsePageSql(String orignSql, Integer page, Integer pageSize);

	/**
	* 描述：获取数据条数Count的SQL
	* @Title: parseCountSql
	* @param tableName
	* @return
	* @author weiyongpeng
	* @date  2024年11月24日 下午5:26:19
	 */
	String parseCountSql(String tableName);
}
